package algorithm.leetcode.medium;

/*
 最佳买卖股票时机含冷冻期
 给定一个整数数组，其中第 i 个元素代表了第 i 天的股票价格 。​
 设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:
    你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
    卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。
 */

/**
 * @author jack.wu
 * @version 1.0
 * @date 2020/12/30
 */
public class Question309 {

    public static void main(String[] args) {
        int[] prices = {1, 2, 3, 0, 2};
        Question309 question = new Question309();
        int maxProfit = question.maxProfit(prices);
        System.out.println(maxProfit);
    }

    /**
     * 思路：
     * f0 :手上持有股票的最大收益
     * f1 :手上不持有股票，并且处于冷冻期中的累计最大收益
     * f2 :手上不持有股票，并且不在冷冻期中的累计最大收益
     */
    public int maxProfit(int[] prices) {
        if (prices == null || prices.length == 0) {
            return 0;
        }
        int f0 = -prices[0];
        int f1 = 0;
        int f2 = 0;
        for (int i = 1; i < prices.length; i++) {
            int newF0 = Math.max(f0, f2 - prices[i]);
            int newF1 = f0 + prices[i];
            int newF2 = Math.max(f1, f2);
            f0 = newF0;
            f1 = newF1;
            f2 = newF2;
        }
        return Math.max(f1, f2);
    }
}
